
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>NIO和Reactor模式 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>NIO和Reactor模式 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">非阻塞I/O (NIO) 是如何解决传统阻塞I/O在高并发场景下效率低下的问题的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在非阻塞I/O中，当应用程序发起读写请求时，它不会等待数据读取或写入完成，而是立即返回控制权。应用程序可以通过轮询或回调机制检查数据是否可用，从而避免了线程阻塞，提升了系统的并发能力。</div>
          </div>
          <div class="card-source">来源: 什么是NIO（Non-blocking I/O）？</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Netty所使用的Java NIO包含哪三个核心组件？它们各自的作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. Channel：代表网络通信中的一个连接，是进行I/O操作的核心对象。<br>2. Selector：一个多路复用器，用于监听多个Channel的I/O事件（如可读、可写），避免为每个连接创建一个线程。<br>3. ByteBuffer：Java NIO提供的缓冲区，用于读取和写入字节数据。</div>
          </div>
          <div class="card-source">来源: NIO的核心组件</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">Reactor模式的核心思想是什么？它如何高效地处理大量并发连接？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Reactor模式的核心思想是将I/O事件的接收和事件的处理分开。它通过事件循环（Event Loop）的设计，将I/O事件分发给不同的处理器，从而能够有效地处理大量连接，避免了传统模型中为每个连接创建一个线程所带来的高昂开销。</div>
          </div>
          <div class="card-source">来源: 什么是Reactor模式？</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在Netty中，`EventLoopGroup`和`EventLoop`扮演着什么角色？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`EventLoopGroup`是管理事件循环的核心组件，它包含多个`EventLoop`。每个`EventLoop`都是一个单独的线程，负责一个或多个`Channel`的I/O事件处理，并接收和处理来自客户端的请求。通过这种设计，一个`EventLoop`可以高效地处理成千上万个连接。</div>
          </div>
          <div class="card-source">来源: Netty中如何实现NIO和Reactor模式？</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Netty中的`ChannelPipeline`是什么？它由什么组成？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`ChannelPipeline`是一个处理器链，负责处理所有的I/O事件。它由多个`ChannelHandler`组成，每个`ChannelHandler`可以处理不同的事件类型，例如数据的解码、业务逻辑处理、响应编码等。</div>
          </div>
          <div class="card-source">来源: Netty中如何实现NIO和Reactor模式？</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在Netty中，`Selector`和`EventLoop`是如何协作来处理I/O事件的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Netty内部使用`Selector`来监听多个`Channel`的I/O事件。当某个`Channel`变为可读或可写状态时，`Selector`会通知对应的`EventLoop`，然后`EventLoop`会将这个事件传递给`ChannelPipeline`中的处理器进行后续处理。</div>
          </div>
          <div class="card-source">来源: Netty中如何实现NIO和Reactor模式？</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">结合NIO和Reactor模式为Netty带来了哪些主要优势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要优势包括：<br>1. 高并发：通过NIO非阻塞特性处理大量连接，无需为每个连接创建线程。<br>2. 高效的资源利用：事件驱动和多路复用避免了线程的频繁创建和销毁。<br>3. 灵活的扩展性：可以通过自定义`ChannelHandler`灵活处理网络事件。<br>4. 低延迟：非阻塞设计能快速响应请求，提高系统响应速度。</div>
          </div>
          <div class="card-source">来源: Netty的NIO和Reactor模式的优势</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">Reactor模式的基本流程由哪三个核心部分组成？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Reactor模式的基本流程由三个核心部分组成：<br>1. 事件循环 (Event Loop)：负责轮询所有I/O事件并分发给处理器。<br>2. 事件处理器 (Handler)：执行具体的业务逻辑，如读写数据。<br>3. 多路复用 (Multiplexing)：通过Selector监听多个I/O事件，避免阻塞。</div>
          </div>
          <div class="card-source">来源: 什么是Reactor模式？</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在Java NIO中，Selector作为多路复用器，其关键作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Selector的关键作用是监听多个`Channel`的I/O事件。它可以监控多个`Channel`是否有事件发生（如可读、可写等）。当某个`Channel`就绪时，`Selector`会通知应用程序处理相应事件，从而让单个线程能够管理多个连接，避免了为每个连接都创建一个线程的问题。</div>
          </div>
          <div class="card-source">来源: NIO的核心组件</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
